package com.palominocia.capa_datos_nodo.util;

import java.util.Properties;

import javax.activation.DataHandler;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;

import com.palominocia.capa_datos_nodo.modelo.administracion.ConfiguracionCorreoSalida;
import com.palominocia.capa_datos_nodo.servicios.entrada.ParametrosEnvio;

public class SendEmail {
	ParametrosEnvio envioparam;
	String adjuntoB64;
	DataHandler adjuntoBin;
	String mensaje;
	int timeout;

	public void setParametrosEnvio(ParametrosEnvio envioparam) {
		this.envioparam = envioparam;
	}

	public void setAdjuntoB64(String adjuntoB64) {
		this.adjuntoB64 = adjuntoB64;
	}

	public void setDataHandler(DataHandler adjuntoBin) {
		this.adjuntoBin = adjuntoBin;
	}

	public void setMensaje(String mensaje) {
		this.mensaje = mensaje;
	}

	public void setTimeout(int timeout) {
		this.timeout = timeout;

	}

	public void enviar() throws MessagingException{
		ConfiguracionCorreoSalida conf =ConfiguracionCorreoSalida.findConfiguracionCorreoSalida((long) 1);
		if(conf instanceof ConfiguracionCorreoSalida){
			// Get system properties
			Properties properties = System.getProperties();
			// Setup mail server
			properties.setProperty("mail.smtp.host", conf.getIpServidor());
			
			// TLS si está disponible
			if(conf.getStarttls()){
				properties.setProperty("mail.smtp.starttls.enable", "true");
			}
			else{
				properties.setProperty("mail.smtp.starttls.enable", "false");
			}
			
			if(conf.getTipoConexion().equals("ssl")){
				properties.setProperty("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
			}
			else{
				properties.remove("mail.smtp.socketFactory.class");
			}
			properties.setProperty("mail.smtp.socketFactory.fallback", "false");
			
			properties.setProperty("mail.smtp.socketFactory.port", conf.getPuerto());
			
			// Get the default Session object.
			Session session = Session.getDefaultInstance(properties);
			
			// Para obtener un log de salida más extenso
			session.setDebug(true);
			
			// Create a default MimeMessage object.
			MimeMessage message = new MimeMessage(session);

			// Set From: header field of the header.
			message.setFrom(new InternetAddress(getEnvioparam().FROM));
			
			// Set To: header field of the header.
			message.addRecipient(Message.RecipientType.TO, new InternetAddress(getEnvioparam().TO));

			if(!getEnvioparam().BCO.equals("")){
				message.addRecipient(Message.RecipientType.BCC, new InternetAddress(getEnvioparam().BCO));
			}
			if(!getEnvioparam().CC.equals("")){
				message.addRecipient(Message.RecipientType.CC, new InternetAddress(getEnvioparam().CC));
			}

			// Set Subject: header field
			message.setSubject(getEnvioparam().Subject);

			//Se seteo el mensaje del e-mail
			MimeBodyPart messageBodyPart = new MimeBodyPart();
			MimeBodyPart messageBodyPart2 = new MimeBodyPart();
			messageBodyPart.setContent(getMensaje(),"text/html");
			
			Multipart multipart = new MimeMultipart();
			multipart.addBodyPart(messageBodyPart);
			//Se adjuntan los archivos al correo
			if(!adjuntoB64.equals("")){
				messageBodyPart.setDataHandler(Utiles.decodeB64(adjuntoB64));
			}
			if(adjuntoBin!=null){
				messageBodyPart2.setDataHandler(adjuntoBin);
				multipart.addBodyPart(messageBodyPart2);
			}
			
			message.setContent(multipart);

			// Send message
			Transport.send(message,message.getAllRecipients());
			System.out.println("Sent message successfully....");
		}
		
	}
	public void procesarEnvio() throws AddressException, MessagingException {
		// Assuming you are sending email from localhost
		String host = "54.69.174.2";

		// Get system properties
		Properties properties = System.getProperties();

		// Setup mail server
		properties.setProperty("mail.smtp.host", host);
		
		// TLS si está disponible
		//properties.setProperty("mail.smtp.starttls.enable", "true");
		properties.setProperty("mail.smtp.starttls.enable", "false");
		
		properties.setProperty("mail.smtp.socketFactory.port", "25");
		//properties.setProperty("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
		//properties.setProperty("mail.smtp.socketFactory.class", "");
		properties.setProperty("mail.smtp.socketFactory.fallback", "false");
		
		if(getEnvioparam().autentificado){
			// Si requiere o no usuario y password para conectarse.
			properties.setProperty("mail.smtp.auth", "true");
			// Puerto de gmail para envio de correos
			properties.setProperty("mail.smtp.port","587");
			
			properties.setProperty("mail.user", getEnvioparam().usuario);
			properties.setProperty("mail.password", getEnvioparam().password);
		}

		// Get the default Session object.
		Session session = Session.getDefaultInstance(properties);
		
		// Para obtener un log de salida más extenso
		session.setDebug(true);
		
		// Create a default MimeMessage object.
		MimeMessage message = new MimeMessage(session);

		// Set From: header field of the header.
		message.setFrom(new InternetAddress(getEnvioparam().FROM));

		// Set To: header field of the header.
		message.addRecipient(Message.RecipientType.TO, new InternetAddress(getEnvioparam().TO));

		message.addRecipient(Message.RecipientType.BCC, new InternetAddress(getEnvioparam().BCO));

		message.addRecipient(Message.RecipientType.CC, new InternetAddress(getEnvioparam().CC));

		// Set Subject: header field
		message.setSubject(getEnvioparam().Subject);

		//Se seteo el mensaje del e-mail
		MimeBodyPart messageBodyPart = new MimeBodyPart();
		messageBodyPart.setContent(getMensaje(),"text/html");
		
		//Se adjuntan los archivos al correo
		/*if(adjuntoBin!=null && adjuntoB64.equals("")){
			messageBodyPart.setDataHandler(adjuntoBin);
		}
		else {
			messageBodyPart.setDataHandler(Utiles.decodeB64(adjuntoB64));
		}*/

		Multipart multipart = new MimeMultipart();
		multipart.addBodyPart(messageBodyPart);
		
		message.setContent(multipart);

		// Send message
		Transport.send(message,message.getAllRecipients());
		System.out.println("Sent message successfully....");
	}

	public ParametrosEnvio getEnvioparam() {
		return envioparam;
	}

	public void setEnvioparam(ParametrosEnvio envioparam) {
		this.envioparam = envioparam;
	}

	public DataHandler getAdjuntoBin() {
		return adjuntoBin;
	}

	public void setAdjuntoBin(DataHandler adjuntoBin) {
		this.adjuntoBin = adjuntoBin;
	}

	public String getAdjuntoB64() {
		return adjuntoB64;
	}

	public String getMensaje() {
		return mensaje;
	}

	public int getTimeout() {
		return timeout;
	}

}
